﻿using CSharp.Basic.Learn.EventBus.Events;
using System;
using System.Collections.Generic;

namespace CSharp.Basic.Learn.EventBus
{
  /// <summary>
  /// 事件总线接口
  /// <remarks> 
  /// 1.目前实现了事件的订阅和解除订阅 发布事件
  /// 2.List<Type>操作考虑并发因素
  /// 3.未提供简便的事件处理实现 （Action）
  /// 4.目前采取的是反射的方式获取事件处理实例 后续考虑结合IoC优化
  /// 5.发布事件目前支持同步方式，后续集成异步发布事件
  /// 6.后续集成消息队列 用于跨项目跨平台
  /// </remarks>
  /// </summary>
  public interface IEventBus
  {
    // 实现强类型的
    // 1.发布事件
    // 2.管理事件（订阅 取消订阅）

    /// <summary>
    /// 发布事件
    /// </summary>
    /// <param name="event">事件实例</param>
    void Publish(IntegrationEvent @event);

    /// <summary>
    /// 发布事件
    /// </summary>
    /// <typeparam name="TEvent">事件类型</typeparam>
    /// <param name="event">事件实例</param>
    void Publish<TEvent>(TEvent @event) where TEvent : IntegrationEvent;

    /// <summary>
    /// 订阅事件
    /// </summary>
    /// <typeparam name="T">事件类型</typeparam>
    /// <typeparam name="THandler">事件处理类型</typeparam>
    void Subscribe<T, THandler>() where T : IntegrationEvent
    where THandler : IIntegrationEventHandler<T>;

    /// <summary>
    /// 解除事件订阅
    /// </summary>
    /// <typeparam name="T">事件类型</typeparam>
    /// <typeparam name="THandler">事件处理类型</typeparam>
    void Unsubscribe<T, THandler>()
          where THandler : IIntegrationEventHandler<T>
          where T : IntegrationEvent;

    /// <summary>
    /// 解除事件所有订阅
    /// </summary>
    /// <typeparam name="T"></typeparam>
    List<Type> UnsubscribeAll<T>() where T : IntegrationEvent;

    //List<IIntegrationEventHandler<T>> UnsubscribeAllReturnStrongType<T>() where T : IntegrationEvent;
  }
}
